console.log(11);
interface IRes {
  code: number;
  status: string;
  data: any;
}
interface Res {
  code?: 10000 | 10001 | 50000;
  status?: 'success' | 'failure';
  data?: any
}
let a: Res = {
  status: 'success'
};
if (a.status === 'success') {
  console.log(123);
}

declare let testRes: Res;

// testRes.status = 'failure'


//$ -------------字面量类型
const str: "linbudu" = "linbudu";
const num: 599 = 599;
const bool: true = true;

// const str1: "linbudu" = "linbudu599";// 报错！不能将类型“"linbudu599"”分配给类型“"linbudu"”。

const str2: string = "linbudu";
const str3: string = "linbudu599";

/* 单独使用字面量类型比较少见，因为单个字面量类型并没有什么实际意义。它通常和联合类型（即这里的 |）一起使用，表达一组字面量类型：*/
interface Tmp {
  bool?: true | false;
  num?: 1 | 2 | 3;
  str?: "lin" | "bu" | "du";
  mixed?: true | string | 599 | {} | (() => {}) | (1 | 2);
  user?: | {
    vip: true; expires?: string;
  } | {
    vip: false;
    promotion?: string;
  }
}
declare var tmp: Tmp;
// if (tmp.user.vip) {
//   console.log(tmp.user.expires);
// }

type Code = 10000 | 10001 | 50000;

type Status = "success" | Code;

const testTwo: Status = 10000


// $---------------对象字面量类型
interface Tmp1 {
  obj: {
    name: "linbudu",
    age: 18
  }
}

const tmp1: Tmp1 = {
  obj: {
    name: "linbudu",
    age: 18
  }
}

//$ ------------枚举
enum PageUrl {
  Home_Page_Url = "url1",
  Setting_Page_Url = "url2",
  Share_Page_Url = "url3",
}

const home = PageUrl.Home_Page_Url;
console.log(home);

//如果你没有声明枚举的值，它会默认使用数字枚举，并且从 0 开始，以 1 递增：
enum Items {
  Foo,
  Bar,
  Baz
}

console.log(Items);
console.log(Items.Baz);

enum Items1 {
  Foo,
  Bar = 599,
  Baz
}

console.log(Items1);
console.log(Items1.Baz);

//在数字型枚举中，你可以使用延迟求值的枚举值，比如函数：如果你使用了延迟求值，那么没有使用延迟求值的枚举成员必须放在使用常量枚举值声明的成员之后（如上例），或者放在第一位：
// 而枚举是双向映射的，即你可以从枚举成员映射到枚举值，也可以从枚举值映射到枚举成员
const returnNum = () => 100 + 499;

enum Items2 {
  Foo = returnNum(),
  Bar = 599,
  Baz = 700
}
console.log(Items2, Items2.Foo);

enum Mixed {
  Num = 599,
  Str = "linbudu"
}
console.log(Mixed[599]);


// $---------- 常量枚举(常量枚举和枚举相似，只是其声明多了一个 const)
const enum Items3 {
  Foo,
  Bar,
  Baz
}
//注意编译后的产物
const fooValue = Items3.Foo; // 0


// 而如果你希望减少编译后的代码，可以进一步地使用在编译后会被完全抹除的常量枚举。